// 之前我们在路由中写的权限处理,单独抽离了一个权限的模块 后期自己写权限处理
import router from '@/router'
import store from '@/store'
import Nprogress from 'nprogress'
import 'nprogress/nprogress.css' // 引入进度条样式
// import { asyncRoutes } from '@/router'
const whiteList = ['/login', '/404']
// 前置导航守卫
router.beforeEach(async(to, from, next) => {
  Nprogress.start()
  // 先判断是否有token
  const token = store.getters.token
  if (token) { // 有token的情况
    if (to.path === '/login') { // 如果用户已经登录过了,还有访问登录页 强制跳转到首页
      next('/') // next('/') 是没有经过后置导航守卫的
      Nprogress.done()
    } else { // 登录过了而且访问别的页面直接放行
      // 点击登录 存储token --> 跳转到 / --> 才能看见navbar -> 获取个人资料, 在跳转后才获取的个人资料, 已经晚了
      // 点击登录存储token  -> 获取资料  -> 跳转到  / ->navbar
      // console.log('获取个人资料') // 触发user获取个人资料的action
      if (!store.state.user.userInfo.userId) { // 只做一次资料的获取
        const { roles: { menus }} = await store.dispatch('user/getUserInfo')
        console.log(menus, '获取资料完成')
        // ---------------------------------------------
        // 真正要做用户主题色的下次登录保存,需要配置服务器来实现,服务器要返回一个对应的主题字段
        // const userTheme = '#e0dd25' // 假设这个值是服务器返回的 一定设置#十六进制的颜色
        // ----------------------------------------
        // res中有roles中menus字段,这个字段是用户权限列表----后期还会回来处理用户权限
        // 在这个位置取出menus, 将menus对应的数量添加给路由规则
        // addRoutes 是给路由添加规则的方法
        // console.log(asyncRoutes) // 8个
        // const filterRoutes = asyncRoutes.filter(item => menus.includes(item.children[0].name))
        // router.addRoutes(...filterRoutes, { path: '*', redirect: '/404', hidden: true }) // 到这已经配置完了权限路由

        const filterRoutes = await store.dispatch('permission/filterRoutes', menus)
        // console.log(filterRoutes) // 当前登录的用户已有的权限
        router.addRoutes([...filterRoutes, { path: '*', redirect: '/404', hidden: true }])
        // 解决刷新页面空白问题
        // 设置用户之前保留的主题色
        // store.dispatch('settings/changeSetting', { key: 'theme', value: userTheme })
        next({
          path: to.path,
          replace: true // 替换路由地址, 刷新的操作不做路由记录的存储
        })
        return
      }
      next()
    }
  } else { // ---------没有token的情况
    // 如果去的页面在白名单中直接放行
    if (whiteList.includes(to.path)) {
      next()
    } else {
      // 去的不是白名单页面
      next('/login')
      Nprogress.done()
    }
  }
})
// 后置导航守卫
router.afterEach((to, from) => {
  Nprogress.done() // 结束进度条
})
